/**
 * @file         bsc_netlink_ports.h
 * @brief        NetLink组件_用于适配硬件适配、通讯口（AT串口）、模块参数设置
 * @note         对外公布
 * @author       Jpz(jinpuzhao@hopechart.com, 靳普诏)
 * @data         2022-9-7
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2022-9-7    <td>1.0                   <td>Jpz             <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */


#ifndef _BSC_NETLINK_MODEM_H_
#define _BSC_NETLINK_MODEM_H_

#include "ofc/ofc_types.h"
#include "mfc/mfc_serial_vir_bus.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 设置属性
 * @param user_param: 用户参数
 * @param attr_id:  属性id
 * @param value:  值
 * @param value_len:  长度
 * @return 
 */
typedef Int32 (*IBsNetlinkModemDoSetAttr)(void *user_param, UInt32 attr_id, void *value, Int32 value_len);

/**
 * 获取属性
 * @param user_param: 用户参数
 * @param attr_id:  属性id
 * @param ret_value:  读取值缓存
 * @param value_len:  传入缓存长度
 * @return 属性实际长度
 */
typedef Int32 (*IBsNetlinkModemDoGetAttr)(void *user_param, UInt32 attr_id, void *ret_value, Int32 value_len);

/**
 * 电源开关控制
 * @param self:     联网模块对象
 * @param power_on:  True:上电 False:断电
 * @return 成功 >= 0
 *         失败 <  0
 */
typedef Int32 (*IBsNetlinkModemDoPowerCtrl)(void *user_param, Bool power_on);

/**
 * 联网模块对象
 */
typedef struct TBsNetlinkModemTag TBsNetlinkModem;
struct TBsNetlinkModemTag
{
    UInt8 modem_process_;   ///< 标记当前芯片程序状态
    UInt8 modem_id_;
    Bool rtt_enable_;
    UInt8 last_net_open_state_;
    void *user_param;
    IBsNetlinkModemDoSetAttr    DoSetAttr;
    IBsNetlinkModemDoGetAttr    DoGetAttr;
    IBsNetlinkModemDoPowerCtrl  DoPowerCtrl;
    TMfSerialVirBus             *vir_bus_;

    UInt32 last_open_tick_;
    UInt32 info_tick_;
    Bool is_net_opened_;
    
};

/**
 * 构造联网模块对象
 * @param self:     联网模块对象
 * @param vir_bus:  虚拟总线对象
 * @param modem_id:  联网模块id
 * @return 
 */
Bool TBsNetlinkModemCreate(TBsNetlinkModem *self, TMfSerialVirBus *vir_bus, UInt8 modem_id);

/**
 * 设置回调函数
 * @param self:     联网模块对象
 * @param user_param:  用户参数
 * @param set_attr:  设置属性
 * @param get_attr:  获取属性
 * @param power_ctrl:  电源控制
 * @return 
 */
void TBsNetlinkModemSetMethod(TBsNetlinkModem *self, void *user_param, IBsNetlinkModemDoSetAttr set_attr,
    IBsNetlinkModemDoGetAttr get_attr, IBsNetlinkModemDoPowerCtrl power_ctrl);

/**
 * 析构联网模块对象
 * @param *self     端口对象
 * @return 
 */
void TBsNetlinkModemDestroy(TBsNetlinkModem *self);

/**
 * 打开联网模块  
 * @param *self     联网模块对象
 * @param *vir_bus  虚拟总线对象
 * @note 触发模块上电操作
 * @return 
 */
Int32 TBsNetlinkModemOpen(TBsNetlinkModem *self);

/**
 * 关闭联网模块 
 * @param *self     联网模块对象
 * @return 
 * @note 触发模块下电操作
 */
void TBsNetlinkModemClose(TBsNetlinkModem *self);

/**
 * 联网模块是否打开
 * @param *self     联网模块对象
 * @return 打开 True ； 关闭 False
 */
Bool TBsNetlinkModemIsOpened(TBsNetlinkModem *self);

/**
 * 打开联网模块网络 
 * @param *self     联网模块对象
 * @param *vir_bus  虚拟总线对象
 * @return 
 */
Int32 TBsNetlinkModemNetOpen(TBsNetlinkModem *self);

/**
 * 关闭联网模块网络 
 * @param *self     联网模块对象
 * @param *vir_bus  虚拟总线对象
 * @return 
 */
Int32 TBsNetlinkModemNetClose(TBsNetlinkModem *self);

/**
 * 判断联网模块是否打开
 * @param *self     联网模块对象
 * @return 打开 True ； 关闭 False
 */
Bool TBsNetlinkModemIsNetOpen(TBsNetlinkModem *self);


/**
 * 设置属性
 * @param *self     模块指针
 * @param attr_id   属性id (@ref TBsNetlinkModemAttrId)
 * @param *value    设定值指针
 * @param value_len 设定值大小
 * @return 成功 >= 0
 *         失败 < 0
 */
Int32 TBsNetlinkModemSetAttr(TBsNetlinkModem *self, UInt32 attr_id, void *value, Int32 value_len);

/**
 * 获取属性  
 * @param *self         模块指针
 * @param attr_id       属性id (@ref TBsNetlinkModemAttrId)
 * @param *ret_value    返回值缓存
 * @param value_len     返回值缓存大小
 * @return 成功，实际值大小 >= 0
 *         失败 < 0
 */
Int32 TBsNetlinkModemGetAttr(TBsNetlinkModem *self, UInt32 attr_id, void *ret_value, Int32 value_len);

/**
 * 设置低功耗模式
 * @param *self         模块指针
 * @param is_low_power  True:低功耗模式； False:正常模式
 * @return 成功 >= 0
 *         失败 < 0
 */
Int32 TBsNetlinkModemSetSleepMode(TBsNetlinkModem *self, Bool is_low_power);


/**
 * 查看当前是否为低功耗模式
 * @param *self          模块指针
 * @return  True:低功耗模式； False:正常模式
 */
Bool TBsNetlinkModemIsSleepMode(TBsNetlinkModem *self);


/**
 * 更新联网模块信息（兼容 406平台使用，内部做）
 * @param *self
 * @return 
 */
void TBsNetlinkModemRunOnce(TBsNetlinkModem *self);


/**
 * 更新联网模块信息 (触发用户适配的属性读写回调)
 * @param *self
 * @return 
 */
void TBsNetlinkModemUpdateAttr(TBsNetlinkModem *self);
void BsNetlinkModemUpdateAttr(TBsNetlinkModem *self);   ///< 代码规范更正




#ifdef __cplusplus
} // extern "C" {
#endif

#endif
